package ru.stepanovdn.trading.server.strategy

import java.time.Duration

abstract class AStrategy {
    /**
     * Карта FIGI, количество лотов для торговли
     *
     * @return
     */
    abstract val figies: Map<String?, Int?>

    /**
     * Количество лотов для торговли по figi
     *
     * @param figi
     * @return
     */
    fun getCount(figi: String?): Int? {
        return figies[figi]
    }

    fun isSuitableByFigi(figi: String?): Boolean {
        return figies.containsKey(figi)
    }

    val name: String
        get() = this.javaClass.simpleName

    open val isEnabled: Boolean
        /**
         * Включена ли стратегия
         */
        get() = false

    /**
     * Задержка между торговлей (продажей и покупкой) в случае продажи по stop loss
     */
    abstract val delayBySL: Duration?

    val isOnlySell: Boolean
        /**
         * Разрешаем только продажу инструмента, запрещаем покупку (после продажи стратегия больше не будет торговаться)
         * Используется для завершения торговли в рамках стратегии, перед ее стратегии
         */
        get() = false

    abstract val type: Type?

    enum class Type(s: String) {
        instrumentByFiat("Инструмент за фиат");

        val title: String? = null
    }
}
